home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / TinyGL / ami / content / ad709 / tinygl / src / image_util.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-15  |  3.3 KB  |  130 lines

  1. /*$T image_util.c GC 1.137 08/09/02 17:47:18 */
  2.  
  3. /*$6
  4.  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  5.  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  6.  */
  7.  
  8. #include "zgl.h"
  9.  
  10. /* image conversion */
  11. void gl_convertRGB_to_5R6G5B(unsigned short *pixmap, unsigned char *rgb, int xsize, int ysize) {
  12.     int                i, n;
  13.     unsigned char    *p;
  14.     /*~~~~~~~~~~~~~~~~~*/
  15.  
  16.     p = rgb;
  17.     n = xsize * ysize;
  18.     for(i = 0; i < n; i++) {
  19.         pixmap[i] = ((p[0] & 0xF8) << 8) | ((p[1] & 0xFC) << 3) | ((p[2] & 0xF8) >> 3);
  20.         p += 3;
  21.     }
  22. }
  23.  
  24. /* */
  25. void gl_convertRGB_to_8A8R8G8B(unsigned int *pixmap, unsigned char *rgb, int xsize, int ysize) {
  26.     int                i, n;
  27.     unsigned char    *p;
  28.  
  29.     p = rgb;
  30.     n = xsize * ysize;
  31.     for(i = 0; i < n; i++) {
  32.         pixmap[i] = (((unsigned int) p[0]) << 16) | (((unsigned int) p[1]) << 8) | (((unsigned int) p[2]));
  33.         p += 3;
  34.     }
  35. }
  36.  
  37. /* linear interpolation with xf,yf normalized to 2^16 */
  38. #define INTERP_NORM_BITS    16
  39. #define INTERP_NORM            (1 << INTERP_NORM_BITS)
  40.  
  41. /* */
  42.  
  43. static inline int interpolate(int v00, int v01, int v10, int xf, int yf) {
  44.     return v00 + (((v01 - v00) * xf + (v10 - v00) * yf) >> INTERP_NORM_BITS);
  45. }
  46.  
  47. /* TODO: more accurate resampling */
  48. void gl_resizeImage(unsigned char *dest, int xsize_dest, int ysize_dest, unsigned char *src,
  49.                     int xsize_src, int ysize_src) {
  50.     unsigned char    *pix, *pix_src;
  51.     float            x1, y1, x1inc, y1inc;
  52.     int                xi, yi, j, xf, yf, x, y;
  53.  
  54.     pix = dest;
  55.     pix_src = src;
  56.  
  57.     x1inc = (float) (xsize_src - 1) / (float) (xsize_dest - 1);
  58.     y1inc = (float) (ysize_src - 1) / (float) (ysize_dest - 1);
  59.  
  60.     y1 = 0;
  61.     for(y = 0; y < ysize_dest; y++) {
  62.         x1 = 0;
  63.         for(x = 0; x < xsize_dest; x++) {
  64.             xi = (int) x1;
  65.             yi = (int) y1;
  66.             xf = (int) ((x1 - floor(x1)) * INTERP_NORM);
  67.             yf = (int) ((y1 - floor(y1)) * INTERP_NORM);
  68.  
  69.             if((xf + yf) <= INTERP_NORM) {
  70.                 for(j = 0; j < 3; j++) {
  71.                     pix[j] = interpolate(pix_src[(yi * xsize_src + xi) * 3 + j],
  72.                                                              pix_src[(yi * xsize_src + xi + 1) * 3 + j],
  73.                                                              pix_src[((yi + 1) * xsize_src + xi) * 3 + j],
  74.                                                              xf, yf);
  75.                 }
  76.             }
  77.             else {
  78.                 xf = INTERP_NORM - xf;
  79.                 yf = INTERP_NORM - yf;
  80.                 for(j = 0; j < 3; j++) {
  81.                     pix[j] = interpolate(pix_src[((yi + 1) * xsize_src + xi + 1) * 3 + j],
  82.                                                              pix_src[((yi + 1) * xsize_src + xi) * 3 + j],
  83.                                                              pix_src[(yi * xsize_src + xi + 1) * 3 + j],
  84.                                                              xf, yf);
  85.                 }
  86.             }
  87.  
  88.             pix += 3;
  89.             x1 += x1inc;
  90.         }
  91.  
  92.         y1 += y1inc;
  93.     }
  94. }
  95.  
  96. #define FRAC_BITS    16
  97.  
  98. /* resizing with no interlating nor nearest pixel */
  99. void gl_resizeImageNoInterpolate(unsigned char *dest, int xsize_dest, int ysize_dest,
  100.                                  unsigned char *src, int xsize_src, int ysize_src) {
  101.     unsigned char    *pix, *pix_src, *pix1;
  102.     int                x1, y1, x1inc, y1inc;
  103.     int                xi, yi, x, y;
  104.  
  105.     pix = dest;
  106.     pix_src = src;
  107.  
  108.     x1inc = (int) ((float) ((xsize_src) << FRAC_BITS) / (float) (xsize_dest));
  109.     y1inc = (int) ((float) ((ysize_src) << FRAC_BITS) / (float) (ysize_dest));
  110.  
  111.     y1 = 0;
  112.     for(y = 0; y < ysize_dest; y++) {
  113.         x1 = 0;
  114.         for(x = 0; x < xsize_dest; x++) {
  115.             xi = x1 >> FRAC_BITS;
  116.             yi = y1 >> FRAC_BITS;
  117.             pix1 = pix_src + (yi * xsize_src + xi) * 3;
  118.  
  119.             pix[0] = pix1[0];
  120.             pix[1] = pix1[1];
  121.             pix[2] = pix1[2];
  122.  
  123.             pix += 3;
  124.             x1 += x1inc;
  125.         }
  126.  
  127.         y1 += y1inc;
  128.     }
  129. }
  130.